perm filename WINDOW.FAI[XAP,BGB]1 blob
sn#047863 filedate 1973-06-09 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00009 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 TITLE WINDOW
C00003 00003 Fields:
C00005 00004 Node format:
C00007 00005 Subroutines MKNODE,KLNODE
C00010 00006 NSUBR(MORCOR)------------------------------------------------------
C00012 00007 Subroutines RINGIN,RINGOUT,INORDER
C00015 00008 NSUBR COPNOD,NODE
C00016 00009 NSUBR MKPAGE,NUMBER,TEMPLATE
C00017 ENDMK
C⊗;
TITLE WINDOW
INTERN DOCUMENT,BLKCNT,AVAIL,REMAINDER
NODSIZ←←4
OLDFF: 0
DOCUMENT: 0
BLKCNT: 0
AVAIL: 0
TMPLT: 0
REMAINDER:0
;Fields:
DEFINE LFIELD $(NAME,OFFSET,TYPE)
{IFIDN <TYPE><>
<DEFINE NAME(AC,NODE)
{ HLRZ AC,OFFSET(NODE)
}
DEFINE NAME$.(AC,NODE)
{ HRLM AC,OFFSET(NODE)
}>
IFIDN <TYPE><I>
<DEFINE NAME(AC,NODE)
{ HLRE AC,OFFSET(NODE)
}
DEFINE NAME$.(AC,NODE)
{ HRLM AC,OFFSET(NODE)
}>
IFIDN <TYPE><F>
<DEFINE NAME(AC,NODE)
{ HLLE AC,OFFSET(NODE)
}
DEFINE NAME$.(AC,NODE)
{ HLLM AC,OFFSET(NODE)
}>}
DEFINE RFIELD $(NAME,OFFSET,TYPE)
{IFIDN <TYPE><>
<DEFINE NAME(AC,NODE)
{ HRRZ AC,OFFSET(NODE)
}
DEFINE NAME$.(AC,NODE)
{ HRRM AC,OFFSET(NODE)
}>
IFIDN <TYPE><I>
<DEFINE NAME(AC,NODE)
{ HRRE AC,OFFSET(NODE)
}
DEFINE NAME$.(AC,NODE)
{ HRRM AC,OFFSET(NODE)
}>
IFIDN <TYPE><F>
<DEFINE NAME(AC,NODE)
{ HRLE AC,OFFSET(NODE)
}
DEFINE NAME$.(AC,NODE)
{ HLRM AC,OFFSET(NODE)
}>}
;____________________________________________________________________
LFIELD(CW,0)↔ RFIELD(CCW,0)
LFIELD(DAD,1)↔ RFIELD(SON,1)
LFIELD(CMIN,2,N)↔ RFIELD(CMAX,2,N)
LFIELD(RMIN,3,N)↔ RFIELD(RMAX,3,N)
RFIELD(PAGNO,3,N)
RFIELD(PTYPE,3)
RFIELD(ATYPE,3)
↓COL←←2
↓ROW←←3
;Node format:
COMMENT $
1. Document
---------------------
0 | --- AVAIL |
1 | --- SON | SON(DOCUMENT)=PAGE
2 | --- Blkcnt |
3 | TMPLT | PAGE template ring
---------------------
2. Page Node
---------------------
0 | CW CCW | Previous and next pages.
1 | DAD SON | DAD(PAGE)=DOCUMENT, SON(PAGE)=AREA
2 | Pageno |
3 | Ptype | Page type bits
---------------------
3. Area
---------------------
0 | CW CCW | Previous and next areas
1 | DAD SON | DAD(AREA)=PAGE, SON(AREA)=WINDOW
2 | Pname |
3 | Atype | Page number, Area type bits
---------------------
4. Window
---------------------
0 | CW CCW | Previous and next windows
1 | DAD --- | DAD(WINDOW)=PAGE
2 | cmin cmax | Min and max columns
3 | rmin rmax | Min and max rows
---------------------
0. Empty
---------------------
0 | -1 AVAIL | Next free node
1 | |
2 | |
3 | |
---------------------
;Subroutines MKNODE,KLNODE
;____________________________________________________________________
NSUBR(MKNODE)
; ALLOCATE A NODSIZ BLOCK OF WORDS - BGB - 4 DEC 1972.
SKIPN 1,@AVAIL
CALL(MORCOR)
HRRZ(1)↔HRRM @AVAIL
SETZM(1)↔AOS @BLKCNT
POP0J
SUBREND MKNODE
;____________________________________________________________________
NSUBR(KLNODE,NODE)
; RELEASE A NODSIZ BLOCK OF WORDS - BGB - 4 DEC 1972.
MOVE 1,NODE
SKIPGE (1)↔GO [ OUTSTR[ASCIZ/EMPTY NODE KILLED!
/]↔POP1J ]
SOS @BLKCNT
SETZM(1)↔HRLI(1)↔HRRI 1(1)↔BLT NODSIZ-1(1)
MOVE @AVAIL↔HRROM(1)↔HRRZM 1,@AVAIL
; POP1J
SUB P,[XWD 2,2]↔POPJ P, ;Faster
SUBREND KLNODE
NSUBR(MORCOR)------------------------------------------------------
;GET MORE CORE - BGB - 4 DEC 1972.
;INITIALIZE DOCUMENT BLOCK POINTERS WHEN NECESSARY.
; SKIPE OLDFF↔GO L1
SKIPE OLDFF↔GO [ FATAL(NODE SPACE FULL) ]
MOVE 1,JOBFF↔MOVEM 1,OLDFF
; AOS 1↔MOVEM 1,DOCUMENT
; ADDI 1,3↔MOVEM 1,AVAIL
; AOS 1↔MOVEM 1,BLKCNT
MOVEM 1,DOCUMENT
MOVEM 1,AVAIL
ADDI 1,2↔MOVEM 1,BLKCNT
AOS 1↔MOVEM 1,TMPLT
SETZM REMAINDER
;FOUR MORE K !
L1: MOVE 1,JOBFF↔MOVE 0,1↔ADDI 0,10000
HRRE 0,0↔JUMPL 0,[FATAL(127K MAX FOR TVFONT, YOU LOSE)]
CALLI 11↔GO[FATAL(NO MORE CORE.)]
AOS 1↔SUB 1,REMAINDER↔MOVEM 2,AC2#↔MOVE 2,JOBFF
SETZM(1)↔LIPI(1)↔LAPI(1)1↔BLT(2)
;MAKE AVAIL LIST.
HRLM 1,1↔ADD 1,[XWD NODSIZ,0]
SKIPE @BLKCNT↔GO .+3
ADD 1,[XWD NODSIZ,NODSIZ]↔AOS@BLKCNT
DAPZ 1,@AVAIL
L2: HLROM 1,(1)↔ADD 1,[XWD NODSIZ,NODSIZ]
CAILE 2,NODSIZ+NODSIZ-1(1)↔GO L2
SUBI 2,NODSIZ-1(1)↔MOVEM 2,REMAINDER
; MOVEI 10000↔ADDM @DOCUMENT
; MOVE 1,DOCUMENT↔MOVE[FILBIT+010000]↔MOVEM 2(1)
MOVE 1,@AVAIL
MOVE 2,AC2↔POP0J
SUBREND;12/16/72-----------------------------------------------------
;Subroutines RINGIN,RINGOUT,INORDER
;____________________________________________________________________
NSUBR RINGIN,PART,WHOLE
;RING PART INTO A WHOLE -BGB- 6 DEC 1972.
MOVE 1,PART
MOVE 3,WHOLE
DAD. 3,1
SON 2,3
JUMPE 2,[SON. 1,3↔CW. 1,(1)↔CCW. 1,(1)↔POP2J]
CW 3,(2)
CW. 3,(1)↔CCW. 1,(3)
CCW. 2,(1)↔CW. 1,(2)
POP2J
SUBREND RINGIN
;____________________________________________________________________
NSUBR RINGOUT,NODE
;Remove node from ring. -TVR- 9 JUN 1973
HRRZ 2,NODE ;Get node
CCW 1,2 ;Get next into 1
CW 3,2 ;Previous into 3
CCW.3,1 ;Make previous's next point to node's next
CCW.1,3 ;Make next's previous point to node's previous
DAD 3,2 ;Is node the head of ring?
SON 0,3
CAMN 0,2
SON. 1,3 ;Yes, new head of ring
POP1J
SUBREND RINGOUT
;____________________________________________________________________
NSUBR INORDER,NODE,NUMBER,RING,FETCH
;Insert node into ring in order!
NEW←3
LAC NEW,NODE ;Get node
LAC 2,RING ;And pointer to ring
DAD. 2,NEW ;Make it DAD of new node
SON 1,2 ;Does he have a son?
JUMPE 1,NEWRING
LOOP: XCT FETCH ;Fetch value
CAML 0,NUMBER ;Does value of this node come after new node?
GO FOUND ;Yes, then we have found it
CCW 1,1 ;No, get next node
CAME 1,RING ;Have we reached the end?
GO LOOP ;No, try again
ADDNOD: CW 2,1 ;Insert new node before this node
CW. 2,NEW↔CW. NEW,1 ;Clockwise pointers
CCW. 1,NEW↔CCW. 3,NEW ;CounterClockwise pointers
POP4J
FOUND: SON 0,2 ;Get back head of ring
CAMN 0,2 ;Before head of ring?
SON. NEW,2 ;Yes, new ring leader!
GO ADDNOD ;Make the rest of the links
NEWRING:SON. NEW,2 ;Make new ring
CW. NEW,(NEW)↔CCW. NEW,(NEW) ;A ring of one
POP4J
SUBREND INORDER
NSUBR COPNOD,NODE
ACCUMULATORS{N}
LAP N,NODE
CALL MKNODE
LAC 0,2(N)
DAC 0,2(1)
LAC 0,3(N)
DAC 0,3(1)
SON 0,N
JUMPE 0,POP1J.
CALL COPRING,0,1
SUBREND COPNOD
;____________________________________________________________________
NSUBR COPRING,OLDSON,NEWDAD
ACCUMULATORS{N}
LAP N,OLDSON
LOOP: CALL COPNOD,N
PUSHP 1(P)
CALL RINGIN,1,NEWDAD
POPP N
CAME N,OLDSON
GO LOOP
POP1J
SUBREND COPNOD
NSUBR MKPAGE,NUMBER,TEMPLATE
CALL MKNODE
DAC 1,NEWPAG
LAC 0,NUMBER
PAGNO. 0,1
CALL(INORDER,1,NUMBER,DOCUMENT,[PAGNO 0,1])
CALL COPNOD,TEMPLATE
CALL RINGIN,1,NEWPAG
POP1J
DECLARE{NEWPAG}
SUBREND MKPAGE